package config

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"

	"excel-exporter/types"
)

// LoadConfig 加载配置文件
func LoadConfig(configPath string) (*types.Config, error) {
	data, err := os.ReadFile(configPath)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %w", err)
	}

	var config types.Config
	if err := json.Unmarshal(data, &config); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %w", err)
	}

	// 验证配置
	if err := validateConfig(&config); err != nil {
		return nil, err
	}

	return &config, nil
}

// validateConfig 验证配置
func validateConfig(config *types.Config) error {
	if len(config.Exports) == 0 {
		return fmt.Errorf("配置错误: 至少需要配置一个导出项")
	}

	for i, export := range config.Exports {
		if export.ExcelPath == "" {
			return fmt.Errorf("配置错误: 第 %d 个导出项的 excel_path 不能为空", i+1)
		}
		
		// 检查输出目录配置
		if export.OutputDir == "" && export.ServerOutputDir == "" && export.ClientOutputDir == "" {
			return fmt.Errorf("配置错误: 第 %d 个导出项必须指定输出目录", i+1)
		}
		
		if len(export.Sheets) == 0 {
			return fmt.Errorf("配置错误: 第 %d 个导出项至少需要配置一个子表", i+1)
		}

		// 确保输出目录存在
		if export.OutputDir != "" {
			if err := createOutputSubDirs(export.OutputDir); err != nil {
				return fmt.Errorf("创建输出目录失败 %s: %w", export.OutputDir, err)
			}
		}
		
		if export.ServerOutputDir != "" {
			if err := createOutputSubDirs(export.ServerOutputDir); err != nil {
				return fmt.Errorf("创建服务端输出目录失败 %s: %w", export.ServerOutputDir, err)
			}
		}
		
		if export.ClientOutputDir != "" {
			if err := createOutputSubDirs(export.ClientOutputDir); err != nil {
				return fmt.Errorf("创建客户端输出目录失败 %s: %w", export.ClientOutputDir, err)
			}
		}
	}

	return nil
}

// createOutputSubDirs 创建输出目录及其子目录
func createOutputSubDirs(baseDir string) error {
	// 创建基础目录
	if err := os.MkdirAll(baseDir, 0755); err != nil {
		return err
	}
	
	// 创建 json 子目录
	jsonDir := filepath.Join(baseDir, "json")
	if err := os.MkdirAll(jsonDir, 0755); err != nil {
		return err
	}
	
	// 创建 lua 子目录
	luaDir := filepath.Join(baseDir, "lua")
	if err := os.MkdirAll(luaDir, 0755); err != nil {
		return err
	}
	
	return nil
}

// GetSheetConfig 获取指定Excel和子表的配置
func GetSheetConfig(config *types.Config, excelPath, sheetName string) (*types.ExportConfig, *types.Sheet) {
	for _, export := range config.Exports {
		if export.ExcelPath == excelPath {
			for _, sheet := range export.Sheets {
				if sheet.SheetName == sheetName {
					return &export, &sheet
				}
			}
		}
	}
	return nil, nil
}

// GetServerOutputPath 获取服务端输出文件路径
func GetServerOutputPath(exportConfig *types.ExportConfig, filename string, subDir string) string {
	// 优先使用服务端专用目录
	if exportConfig.ServerOutputDir != "" {
		return filepath.Join(exportConfig.ServerOutputDir, subDir, filename)
	}
	// 其次使用统一目录
	if exportConfig.OutputDir != "" {
		return filepath.Join(exportConfig.OutputDir, "server", subDir, filename)
	}
	// 默认使用当前目录
	return filepath.Join("server", subDir, filename)
}

// GetClientOutputPath 获取客户端输出文件路径
func GetClientOutputPath(exportConfig *types.ExportConfig, filename string, subDir string) string {
	// 优先使用客户端专用目录
	if exportConfig.ClientOutputDir != "" {
		return filepath.Join(exportConfig.ClientOutputDir, subDir, filename)
	}
	// 其次使用统一目录
	if exportConfig.OutputDir != "" {
		return filepath.Join(exportConfig.OutputDir, "client", subDir, filename)
	}
	// 默认使用当前目录
	return filepath.Join("client", subDir, filename)
}

// GetAllExports 获取所有导出配置
func GetAllExports(config *types.Config) []types.ExportConfig {
	return config.Exports
}